
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<?php
require_once LIBRARIES_ENTITIES_DATABASE;
require_once LIBRARIES_ENTITIES_FIELDS;
require_once LIBRARIES_ENTITIES_UNITS;
require_once LIBRARIES_ENTITIES_UNITTYPES;
require_once LIBRARIES_ENTITIES_PROCEDURES;

require_once LIBRARIES_TOOLS_UTILITY;
require_once LIBRARIES_TOOLS_XTEMPLATE;
require_once LIBRARIES_TOOLS_PAGERBACKEND;

class UnitComponent {

    //put your code here
    public function invoke() {

        // kiểm tra session
        if ($_SESSION["session"]["key"] == "Supper Administrator" || $_SESSION["session"]["key"] == "Administrator" || $_SESSION["session"]["key"] == "Editor") {

            // biến lưu giá trị hiển thị
            $view = '';
            if (isset($_GET['view'])) {
                $view = $_GET['view'];
            }

            // hành động
            $action = '';
            if (isset($_POST['hdAction'])) {
                $action = $_POST['hdAction'];
            }


            // tác vụ
            $task = '';
            if (isset($_GET['task'])) {
                $task = $_GET['task'];
            }

            // tổng số dòng muốn hiển thị
            $rowToView = 10;
            if (isset($_POST["limit"])) {
                $rowToView = $_POST["limit"];
            }

            // derectory running file
            $dir = dirname(__FILE__);



            // kiểm tra giá trị biến view
            // nếu là 'article' thì sẽ hiển thị trang danh sách bài viết
            if ($view == 'unit') {

                if ($action == 'remove') {

                    // mảng danh sách giá trị id
                    $values = $_POST["cid"];

                    $result = $this->deleteUnitByID($values);
                    if ($result == OK) {
                        Utility::messageBox('Xóa thành công');
                    } else if ($result == FOREIGN_KEY) {
                        Utility::messageBox('Không thể Xóa vì có thể đã có các Thủ tục thuộc Sở!');
                    }
                } else if ($action == 'add' || $action == 'addAndExit') {

                    $name = $_POST['txtTitle'];

                    $result = $this->addUnit($name);

                    if ($result == OK) {
                        if ($action == 'add') {
                            Utility::messageBox('Thêm thành công');
                        } else {
                            Utility::redirect(".?com=com_unit&view=unit&task=view");
                        }
                    }
                } else if ($action == 'edit' || $action == 'editAndExit') {

                    $ID = $_POST['hdID'];
                    $name = $_POST['txtTitle'];

                    $result = $this->updateUnit($ID, $name);

                    if ($result == OK) {
                        if ($action == 'edit') {
                            Utility::messageBox('Cập nhật thành công');
                        } else {
                            Utility::redirect(".?com=com_unit&view=unit&task=view");
                        }
                    }
                }




                if ($task == 'view') {

                    $viewFile = $dir . '/views/unit_list.html';

                    $xtemplate = new XTemplate($viewFile);


                    // chỉ mục của checkbox
                    $indexCheckBox = 1;

                    // page hiện tại đang xem
                    $rurrentPage = 1;
                    if (isset($_POST["page"])) {
                        $rurrentPage = $_POST["page"];
                    }

                    // chỉ mục (số thứ tự của bài viết) bài viết
                    $index = 1;


                    // tải danh sách bài viết
                    $units = $this->getUnitList();


                    // tải đối tượng phân trang
                    $pager = PagerBackEnd::getPagerData(count($units), $rowToView, $rurrentPage);


                    if ($units != null) {

                        $indexCheckBox = 1;
                        // in danh sách bài viết
                        foreach ($units as $unit) {

                            if ($index > $pager->offset && $index <= $pager->limit) {

                                $xtemplate->assign('INDEX', $index);

                                $xtemplate->assign('INDEX_CHECKBOX', $indexCheckBox);

                                $xtemplate->assign('UNIT_ID', $unit->getID());
                                $xtemplate->assign('UNIT_NAME', $unit->getName());

                                $xtemplate->parse('main.unit_list');

                                $indexCheckBox++;
                            }
                            $index++;
                        }
                    }

                    // danh sách chọn số dòng hiển thị
                    $xtemplate->assign('LIMIT_LIST', Utility::getLimitList($rowToView));

                    // tổng số dòng hiển thị
                    $xtemplate->assign('ROW_TO_VIEW', $rowToView);

                    // trang hiện tại
                    $xtemplate->assign('CURRENT_PAGE', $rurrentPage);

                    // tổng số trang có được
                    $xtemplate->assign('AMOUNT_OF_PAGE', $pager->numPages);

                    // định dạng phân trang html
                    $xtemplate->assign('PAGING_HTML', $pager->paging);


                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else if ($task == 'add') {

                    $xtemplate = new XTemplate($dir . '/views/unit_add.html');
                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                } else if ($task == 'edit') {

                    $unitID = '';

                    if (isset($_GET['ID'])) {
                        $unitID = $_GET['ID'];
                    }

                    $unit = $this->getUnitByID($unitID);


                    if ($unit != null) {
                        $xtemplate = new XTemplate($dir . '/views/unit_edit.html');

                        $xtemplate->assign('UNIT_ID', $unit->getID());
                        $xtemplate->assign('UNIT_NAME', $unit->getName());

                        $xtemplate->parse('main');
                        $xtemplate->out('main');
                    } else {
                        Utility::redirect('.?com=com_unit&view=unit&task=view');
                    }
                }
            }
        }
    }

    private function getUnitList() {
        $db = new Database();
        try {
            $unit = new Units();
            $result = $unit->getList($db);
            $db->submitChanges($db);
            return $result;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function addUnit($name) {
        $db = new Database();
        try {
            $unit = new Units();
            $unit->setName($name);
            $unit->add($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function updateUnit($ID, $name) {
        $db = new Database();
        try {
            $unit = new Units();
            $unit->setID($ID);
            $unit->setName($name);
            $unit->update($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function deleteUnitByID($values) {
        $db = new Database();
        try {

            for ($i = 0; $i < count($values); $i++) {
                $unit = new Units();
                $unit->setID($values[$i]);
                $unit->delete($db);
            }

            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            if (Utility::checkStringIn(FOREIGN_KEY, $exc->getMessage())) {
                return FOREIGN_KEY;
            } else {
                echo $exc->getMessage();
            }
            $db->rollback();
        }
    }

    private function getUnitByID($unitID) {
        $db = new Database();
        try {
            $unit = new Units();
            $unit->setID($unitID);
            $unit = $unit->getByID($db);
            $db->submitChanges();
            return $unit;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            $db->rollback();
            exit();
        }
    }

}
?>
